Function.prototype.yzbind = function(thisArg, ...argArray) {
  // 1.获取到真实需要调用的函数
  var fn = this
  
  // 2.绑定this
  thisArg = (thisArg !== null && thisArg !== undefined) ? Object(thisArg) : window


  function proxyFn(...args) {
    // 3.将函数放到thisArgs当中
    thisArg.fn = fn
    // 外部和内部参数合并
    var finalArgs = [...argArray, ...args]
    var result = thisArg.fn(...finalArgs)
    delete thisArg.fn
    return result
  }


  return proxyFn
}

function foo() {
  console.log("foo", this)
  return 20
}


function sum(num1, num2, num3, num4) {
  console.log(num1, num2, num3, num4)
}

// 系统调用 方式
// var bar = foo.bind("abc")
// bar()

// var newSum = sum.bind("aaa", 10, 20, 30, 40)
// newSum()

// var newSum1 = sum.bind("bbb")
// newSum1(10, 20, 30, 40)

// var newSum2 = sum.bind("bbb", 10, 20)
// newSum2(30, 40)

// 自己定义的bind
var bar = foo.yzbind("456")
console.log(bar())

var newSum = sum.yzbind("abc", 10, 20)
var result = newSum(30, 40)
